/**
 * graphmanager.h
 * Interface untuk modul graphmanager
 * Modul ini menangani arus data yang melalui graph sistem
 * Termasuk penanganan struktur data dan atribut untuk setiap nodes
 * Fri, 4 Dec 2009
 * By Karol Danutama 13508040
 * */


#ifndef graphmanager_h
#define graphmanager_h

#include "../dbmanager/dbmanager.h"
#include "../system/system.h"

//KONSTRUKTOR
void CreateEmptyNodeList(TNodeList *NodeList);
/**
 * I.S: NodeList terdefinisi
 * F.S: NodeList terbentuk sebagai list of node kosong
 * Membuat NodeList kosong
 * */

void CreateEmptyAdjList(TAdjList *AdjList);
/**
 * I.S: AdjList terdefinisi
 * F.S: AdjList terbentuk sebagai adjacency list kosong
 * Membuat adjacency list kosong
 * */

void CreateEmptyAdjMatrix(TAdjMatrix m);
/**
 * I.S: m terdefinisi
 * F.S: m terbentuk sebagai adjacency matrix kosong
 * Membuat adjacency matrix kosong
 * */

TNode CreateNode(string Name , boolean IsServer , boolean IsClient , float CPUTime);
/**
 * Membuat node baru dengan atribut Name IsServer IsClient dan CPUTime
 * */

int AddNode(TNodeList *NodeList , TNode node);
/**
 * Menambah node baru pada NodeList, mengembalikan error code, 0 jika penambahan sukses
 * */

int AddEdge(TAdjMatrix m , TAdjList *AdjList , int org , int dest , float Bandwidth);
/**
 * Menambah edge baru ke Adj Matrix dan Adj List, mengembalikan error code, 0 jika penambahan sukses
 * */

int CountEdge(TAdjMatrix m , int NNode);
/**
 * Menghitung edge efektif pada m
 * */

//ADDRESS RETRIEVAL
int GetPhysicalNodeName(TNodeList *t , string name);
/**
 * Mengambil alamat fisik dari sebuah node
 * */

string GetActualNodeName(TNodeList *t , int address);
/**
 * Mengambil alamat/ID aktual dari sebuah alamat fisik
 * */

//TABLE MANAGEMENT
void AddStudentsTable(TNode *node , TTabstudents students);
/**
 * I.S: node, students terdefinisi
 * F.S: terbentuk tabel students pada node
 * Menambah table mahasiswa untuk sebuah node
 * */

void AddLecturesTable(TNode *node , TTablectures lectures);
/**
 * I.S: node, lectures terdefinisi
 * F.S: terbentuk tabel lectures pada node
 * Menambah table matakuliah untuk sebuah node
 * */

void AddLectures_StudentsTable(TNode *node , TTablectures_students lectures_students);
/**
 * I.S: node, lectures_students terdefinisi
 * F.S: terbentuk tabel lectures_students pada node
 * Menambah table pengambilanmk untuk sebuah node
 * */

int CreateStudentsTable(TNode *node);
/**
 * Membuat tabel mahasiswa untuk sebuah node, mengembalikan error code, 0 jika penambahan sukses
 * */

int CreateLecturesTable(TNode *node);
/**
 * Membuat tabel matakuliah untuk sebuah node, mengembalikan error code, 0 jika penambahan sukses
 * */

int CreateLectures_StudentsTable(TNode *node);
/**
 * Membuat tabel pengambilanmk untuk sebuah node, mengembalikan error code, 0 jika penambahan sukses
 * */

//DIJKSTRA SAKTI :p
TRetvalDijkstra FindPath(TAdjMatrix m , float CPUTime , int NNode , int org , int dest , int size);
/**
 * Mencari jalur paling optimum dari org ke dest, dalam lingkup adjacency matrix m dengan ukuran data size
 * */

//I-O
void PrintNodeInfo(TNode *node);
/**
 * I.S: node terdefinisi
 * F.S: tercetak info dari sebuah node
 * Mencetak informasi dari sebuah node
 * */

void PrintNodeList(TNodeList *nodes , boolean IsAsc);
/**
 * I.S: nodes tedefinisi
 * F.S: tercetak isi dari Node list
 * Mencetak info dari NodeList, dengan properti ascending/descending
 * */

void PrintPath(TRetvalDijkstra r , TNodeList *nodes);
/**
 * I.S: r, nodes terdefinisi
 * F.S: tercetak jalur yang dilalui pada proses FindPath yang disimpan dalam r
 * Mencetak jalur yang digunakan dalam proses FindPath
 * */

void PrintAdjList(TAdjList AdjList , TNodeList *nodes , boolean IsASC);
/**
 * I.S: AdjList, nodes terdefinisi
 * F.S: tercetak isi dari adjacency list
 * Mencetak isi adj list
 * */

void PrintAdjMatrix(TAdjMatrix m , int NNode);
/**
 * I.S: m, NNode terdefinisi
 * F.S: tercetak isi dari m
 * Mencetak isi Adj Matrix
 * */


//SORTER
TNodeList SortNodeListByName(TNodeList *nodes);
/**
 * Mengurutkan Node List berdasarkan nama
 * */

TAdjList SortAdjList(TAdjList A);
/**
 * Mengurutkan Adj List berdasarkan bandwidth
 * */

//FILTER
TNodeList FilterServers(TNodeList *nodes);
/**
 * Melakukan penyaringan nodes yang merupakan server
 * */

TNodeList FilterClients(TNodeList *nodes);
/**
 * Melakukan penyaringan nodes yang merupakan client
 * */

#endif
